package com.baixun.gascommon.utils;

import com.baixun.gascommon.enums.ResultStatus;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.Data;

import java.io.Serializable;

@Data
public class R<T> implements Serializable {

    private Integer code;
    private String msg;
    private T data;

    public R() {}

    /**
     * 泛型方法，用于创建一个表示成功的R对象
     * @param object 任何类型的对象，将作为数据部分返回
     * @param <T> 泛型参数，表示返回对象的类型
     * @return 返回一个状态码为200，消息为"成功"，并包含给定对象数据的R对象
     */
    public static <T> R<T> success(T object) {
        R<T> r = new R<>();
        r.setData(object);
        r.setCode(200);
        r.setMsg("成功");
        return r;
    }

    /**
     * 创建一个表示失败的R对象，不包含数据
     * @param resultStatus 结果状态枚举，提供失败的状态码和消息
     * @return 返回一个包含给定结果状态的R对象，无数据部分
     */
    public static R fail(ResultStatus resultStatus) {
        R r = new R();
        r.setCode(resultStatus.getCode());
        r.setMsg(resultStatus.getMessage());
        return r;
    }

    /**
     * 创建一个表示失败的R对象，包含数据
     * @param resultStatus 结果状态枚举，提供失败的状态码和消息
     * @param object 任何类型的对象，将作为数据部分返回
     * @return 返回一个包含给定结果状态和对象数据的R对象
     */
    public static R fail(ResultStatus resultStatus, Object object) {
        R r = new R();
        r.setCode(resultStatus.getCode());
        r.setMsg(resultStatus.getMessage());
        r.setData(object);
        return r;
    }

    /**
     * 创建一个带分页数据的成功响应
     * @param data 分页数据
     * @param <T> 泛型参数，表示数据类型
     * @return 返回包含分页数据的R对象
     */
    public static <T> R<T> ok(IPage<T> data) {
        R<T> r = new R<>();
        r.setCode(200);
        r.setMsg("成功");
        r.setData((T) data);
        return r;
    }
}
